package com.cskaoyan.javase.oop1._11static._2compare;
/**
 * 首先以静态成员变量 vs 成员变量 做比较
 * 我们从以下四个角度比较（拿成员变量为例）
 * 1.成员的所属
 *      成员变量: 属于对象,必须创建对象,必须有对象,才可能有成员变量.
 *      静态成员变量: 属于类,无需创建对象,只需要该类类加载就能够访问使用.
 * 2.在内存中的位置
 *      成员变量: 堆上对象当中
 *      静态成员变量: Java8之后也存在堆上一片被对象所共享的区域
 *
 * 3.在内存中出现的时间
 *      成员变量: new对象之后,存在对象之后,才有成员变量
 *      静态成员变量: 类加载之后就存在,就可以用了
 *          所以静态变量一定先存着,成员变量一定后存在.
 * 4.调用方式
 *      成员变量: 对象名点
 *      静态成员变量: 类名点
 *
 *
 * 静态成员方法 vs 成员方法
 * 我们主要分析静态成员方法和成员方法当中,究竟能够访问什么内容?
 * 思考以下问题:
 *      1.静态成员方法中,可不可以访问静态成员/普通成员?
 *          能不能访问静态成员? 当然可以,原因是类加载完毕,它们都可用了.从原理上分析,这完全可行
 *          能不能直接访问普通成员?
 *              当然不可以
 *              因为从内存的角度思考,即便一个类类加载了,但是它的对象完全可能不存在.
 *              也就是说static访问非static,就存在一个访问不到的问题,所以禁止访问.
 *
 *      2.成员方法中,可不可以访问静态成员/普通成员?
 *          能不能直接访问静态成员?
 *              肯定可以,因为对象都存在了,类加载一定进行了,静态成员一定存在可以使用了.
 *
 *
 * @since 15:11
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}
class Student{
    int age;
    static String gender;
    public void test(){}
    public static void testStatic(){}

    public void MemberMethod(){
        System.out.println(age);
        System.out.println(gender);
        test();
        testStatic();
    }
    public static void StaticMemberMethod(){
        testStatic();
        System.out.println(gender);
        // System.out.println(age);
        // _3test();
    }

}
